package com.ctrl.riveradministrator.http;

import com.ctrl.riveradministrator.mvp.model.Bulletin;
import com.ctrl.riveradministrator.mvp.model.ChannelSeg;
import com.ctrl.riveradministrator.mvp.model.Contact;
import com.ctrl.riveradministrator.mvp.model.Drain;
import com.ctrl.riveradministrator.mvp.model.FileInfo;
import com.ctrl.riveradministrator.mvp.model.Information;
import com.ctrl.riveradministrator.mvp.model.LearnZoom;
import com.ctrl.riveradministrator.mvp.model.Login;
import com.ctrl.riveradministrator.mvp.model.News;
import com.ctrl.riveradministrator.mvp.model.Problem;
import com.ctrl.riveradministrator.mvp.model.Reach;
import com.ctrl.riveradministrator.mvp.model.Report;
import com.ctrl.riveradministrator.mvp.model.RiverInfo;
import com.ctrl.riveradministrator.mvp.model.RiverPolicy;
import com.ctrl.riveradministrator.mvp.model.SceneryShare;
import com.ctrl.riveradministrator.mvp.model.Suggest;
import com.ctrl.riveradministrator.mvp.model.Task;
import com.ctrl.riveradministrator.mvp.model.ToDo;
import com.ctrl.riveradministrator.mvp.model.TraceSearch;
import com.ctrl.riveradministrator.mvp.model.Version;
import com.ctrl.riveradministrator.mvp.model.WorkDynamic;

import java.util.Map;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.QueryMap;
import retrofit2.http.Streaming;
import retrofit2.http.Url;

public interface APIService {

    /**
     * 用户登录
     *
     * @param params username password
     * @return 主要为用户ID
     */
    @FormUrlEncoded
    @POST("api/Applogin")
    Observable<RespModel<Login>> login(@FieldMap Map<String, String> params);

    /**
     * 公示牌展示信息
     *
     * @param params pageNumb 索引页数，pageSize 索引条数
     * @return 公示牌信息
     */
    @FormUrlEncoded
    @POST("api/ctrlPsign/list")
    Observable<RespModel<Bulletin>> getBulletin(@FieldMap Map<String, String> params);


    /**
     * 工作动态
     *
     * @param params pageNumb 索引页数，pageSize 索引条数
     * @return 工作动态列表
     */
    @FormUrlEncoded
    @POST("api/ctrl/ctrlWorkTrend")
    Observable<RespModel<WorkDynamic>> getWorkDyn(@FieldMap Map<String, String> params);

    /**
     * 待办事项展示信息
     *
     * @param params userId用户ID
     * @return 待办事项信息
     */
    @FormUrlEncoded
    @POST("api/daiban")
    Observable<RespModel<ToDo>> getToDoList(@FieldMap Map<String, String> params);

    /**
     * 通知公告
     *
     * @param params pageNumb 索引页数，pageSize 索引条数
     * @return 通知公告列表
     */
    @FormUrlEncoded
    @POST("api/ctrl/notice")
    Observable<RespModel<Information>> getInfo(@FieldMap Map<String, String> params);

    /**
     * 文件通知
     *
     * @param params pageNumb 索引页数，pageSize 索引条数
     * @return 文件通知列表
     */
    @FormUrlEncoded
    @POST("api/ctrlFile")
    Observable<RespModel<FileInfo>> getFileInfo(@FieldMap Map<String, String> params);

    /**
     * 联系人
     *
     * @param params pageNumb 索引页数，pageSize 索引条数
     * @return 联系人列表
     */
    @FormUrlEncoded
    @POST("api/AddressBook")
    Observable<RespModel<Contact>> getContact(@FieldMap Map<String, String> params);

    /**
     * 河流列表
     *
     * @param params pageNumb 索引页数，pageSize 索引条数
     * @return 河流信息
     */
    @FormUrlEncoded
    @POST("api/ctrl/ctrlRiver/list")
    Observable<RespModel<RiverInfo>> getRiverInfo(@FieldMap Map<String, String> params);

    /**
     * 河段列表
     *
     * @param params pageNumb 索引页数，pageSize 索引条数
     * @return 河段信息
     */
    @FormUrlEncoded
    @POST("api/ctrl/ctrlReach")
    Observable<RespModel<ChannelSeg>> getSegInfo(@FieldMap Map<String, String> params);

    /**
     * 一河一策
     *
     * @param params id 河流Id
     * @return 一河一策信息
     */
    @FormUrlEncoded
    @POST("api/ctrl/ctrlPolicy")
    Observable<RespModel<RiverPolicy>> getRiverPolicy(@FieldMap Map<String, String> params);

    /**
     * 排污口管理信息
     *
     * @param params id 排污口
     * @return 排污口管理信息
     */
    @FormUrlEncoded
    @POST("api/selectDrain")
    Observable<RespModel<Drain>> getDrain(@FieldMap Map<String, String> params);

    /**
     * 判断是否巡河状态
     *
     * @param params 用户ID
     * @return 成功消息，失败消息
     */
    @FormUrlEncoded
    @POST("api/isWork")
    Observable<RespModel<Integer>> isTrace(@FieldMap Map<String, String> params);

    /**
     * 强制取消巡河状态/巡检结束
     *
     * @param params 用户ID
     * @return 成功消息，失败消息
     */
    @FormUrlEncoded
    @POST("api/endTrackByUserId")
    Observable<RespModel<String>> focusEnd(@FieldMap Map<String, String> params);

    /**
     * 巡河开始请求
     *
     * @param params 用户ID，河段ID
     * @return 成功消息，失败消息
     */
    @FormUrlEncoded
    @POST("api/selectStatus")
    Observable<RespModel<Task>> startPatrol(@FieldMap Map<String, String> params);

    /**
     * 巡河历史记录查询
     *
     * @param params 分页查询
     * @return 成功消息，失败消息
     */
    @FormUrlEncoded
    @POST("api/patrolPage")
    Observable<RespModel<Task>> patrolHistory(@FieldMap Map<String, String> params);

    /**
     * 巡河轨迹查询
     *
     * @param params 轨迹点
     * @return 成功消息，失败消息
     */
    @FormUrlEncoded
    @POST("api/guiji")
    Observable<RespModel<TraceSearch>> traceHistory(@FieldMap Map<String, String> params);

    /**
     * 上报巡河路径
     *
     * @param params 经纬度，时间
     * @return 成功消息，失败消息
     */
    @FormUrlEncoded
    @POST("api/track")
    Observable<RespModel<RiverPolicy>> uploadPatrol(@FieldMap Map<String, String> params);

    /**
     * 获取所有河段ID和名称
     *
     * @return 成功消息，失败消息
     */
    @FormUrlEncoded
    @POST("api/selectReach")
    Observable<RespModel<Reach>> getReach(@FieldMap Map<String, String> params);


    /**
     * 获取所有水库ID和名称
     *
     * @return 成功消息，失败消息
     */
    @FormUrlEncoded
    @POST("api/selectSkList")
    Observable<RespModel<Reach>> getReservoir(@FieldMap Map<String, String> params);

    /**
     * 根据用户id查询用户的水库列表
     *
     * @return 成功消息，失败消息
     */
    @FormUrlEncoded
    @POST("api/selectReservoirNameList")
    Observable<RespModel<Reach>> getReservoirById(@FieldMap Map<String, String> params);

    /**
     * 根据水库id获取统计报告
     *
     * @return 成功消息，失败消息
     */
    @GET("api/static-report/reservoir")
    Observable<RespModel<Reach>> getStatisticsById(@QueryMap Map<String, String> params);

    /**
     * 根据河流id获取统计报告
     *
     * @return 成功消息，失败消息
     */
    @GET("api/static-report/river")
    Observable<RespModel<Reach>> getStatisticsRiverById(@QueryMap Map<String, String> params);

    /**
     * 学习园地
     *
     * @return 成功消息，失败消息
     */
    @FormUrlEncoded
    @POST("api/selectLearn")
    Observable<RespModel<LearnZoom>> getLearn(@FieldMap Map<String, String> params);

    /**
     * 美景分享
     *
     * @return 成功消息，失败消息
     */
    @FormUrlEncoded
    @POST("api/selectShare")
    Observable<RespModel<SceneryShare>> getScenery(@FieldMap Map<String, String> params);

    /**
     * 获取建言献策
     *
     * @return 建言献策
     */
    @FormUrlEncoded
    @POST("api/selectSuggest")
    Observable<RespModel<Suggest>> getAdvice(@FieldMap Map<String, String> params);

    /**
     * 查询关于自己反馈或分配的问题列表
     *
     * @return 关于自己反馈或分配的问题列表
     */
    @FormUrlEncoded
    @POST("api/selectMyProblem")
    Observable<RespModel<Problem>> getProblems(@FieldMap Map<String, String> params);

    /**
     * 分配下级列表查询
     *
     * @return 分配下级列表查询
     */
    @FormUrlEncoded
    @POST("api/selectWorkUser")
    Observable<RespModel<Problem>> getCheckPerson(@FieldMap Map<String, String> params);

    /**
     * 指派
     *
     * @return 分配下级列表查询
     */
    @FormUrlEncoded
    @POST("api/zhipai")
    Observable<RespModel<Problem>> assignment(@FieldMap Map<String, String> params);

    /**
     * 上传建言献策
     *
     * @return 建言献策
     */
    @FormUrlEncoded
    @POST("api/addSuggest")
    Observable<RespModel<Suggest>> postAdvice(@FieldMap Map<String, String> params);

    /**
     * 新闻列表
     *
     * @return 建言献策
     */
    @FormUrlEncoded
    @POST("api/selectNews")
    Observable<RespModel<News>> getNews(@FieldMap Map<String, String> params);


    /**
     * 上传图片
     *
     * @param part
     * @return
     */
    @Multipart
    @POST("api/ViolateImport")
    // Observable<RespModel> uploadFile(@PartMap Map<String, RequestBody> params);
    Observable<RespModel> illegalReport(@Part("userid") String userid,
                                        @Part("type") String type,
                                        @Part("content") String content,
                                        @Part MultipartBody.Part part);

    /**
     * 问题上报
     *
     * @param part
     * @return
     */
    @Multipart
    @POST("api/addShangbao")
    // Observable<RespModel> uploadFile(@PartMap Map<String, RequestBody> params);
    Observable<RespModel> problemRecording(@PartMap Map<String, RequestBody> params,
                                        @Part MultipartBody.Part part);

    /**
     * 巡河解决问题（反馈）
     *
     * @return
     */
    @Multipart
    @POST("api/addFankui")
    Observable<RespModel<Problem>> feedback(@PartMap Map<String, RequestBody> params,
                                            @Part MultipartBody.Part part);

    /**
     * 下载文件
     * @param url 待下载文件的路径，断点续传
     * @return responseBody
     */
    @Streaming
    @GET
    Observable<ResponseBody> download(/*@Header("RANGE") String start,*/ @Url String url);

    /**
     * 检查更新
     *
     * @return hzz_update.json
     */
    @GET("file/apk/getVersion")
    Observable<RespModel<Version>> checkVersion(@QueryMap Map<String, String> params);
}
